#include "mdichild.h"
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include <QFileInfo>
#include <QApplication>
#include <QFileDialog>
#include <QCloseEvent>
#include <QPushButton>
#include <QMenu>

MdiChild::MdiChild(QWidget *parent)
    : QTextEdit(parent)
{
    // 设置在子窗口关闭时销毁这个类的对象
    setAttribute(Qt::WA_DeleteOnClose);
    // 初始化isUntitled为true
    isUntitled = true;
}

void MdiChild::newFile()
{
    // 设置窗口编号，因为编号一直被保存，所以需要使用静态变量
    static int sequenceNumber = 1;
    // 新建的文档没有被保存过
    isUntitled= true;
    // 将当前文件命名文档加编号
    curFile = tr("未命名文档%1.txt").arg(sequenceNumber++);
    // 设置窗口标题
    setWindowTitle(curFile + "[*]" + " - 多文档编辑器");
    // 文档更改发射信号
    connect(document(), SIGNAL(contentsChanged()), this, SLOT(documentWasModified()));
}

bool MdiChild::loadFile(const QString &filename)
{
    QFile file(filename);
    if (!file.open(QFile::ReadOnly | QFile::Text)) {
        QMessageBox::warning(this, "多文本编辑器", tr("无法读取文件%1：\n%2.").arg(filename, file.errorString()));
        return false;
    }

    QTextStream in(&file);
    // 设置鼠标状态未等待状态
    QApplication::setOverrideCursor(Qt::WaitCursor);

    setPlainText(in.readAll());
    //恢复鼠标状态
    QApplication::restoreOverrideCursor();
    // 设置当前文件
    setCurrentFile(filename);
    // 文档更改发射信号
    connect(document(), SIGNAL(contentsChanged()), this, SLOT(documentWasModified()));

    return true;
}

bool MdiChild::save()
{
    // 如果文件未被保存过，则执行另存操作
    if (isUntitled)
        return saveAs();
    else
        return saveFile(curFile);
}

bool MdiChild::saveAs()
{
    // 另存为
    QString filename = QFileDialog::getSaveFileName(this, "另存为", curFile);
    if (filename.isEmpty())
        return false;
    return saveFile(filename);
}

bool MdiChild::saveFile(const QString &filename)
{
    // 保存文件
    QFile file(filename);
    if (!file.open(QFile::WriteOnly | QFile::Text)) {
        QMessageBox::warning(this, "多文本编辑器", tr("无法写入文件%1：\n%2.").arg(filename, file.errorString()));
        return false;
    }

    QTextStream out(&file);

    QApplication::setOverrideCursor(Qt::WaitCursor);

    out << toPlainText();

    QApplication::restoreOverrideCursor();

    setCurrentFile(filename);

    return true;
}

QString MdiChild::userFriendlyCurrentFile()
{
    // 从文件中提取文件名
    return QFileInfo(curFile).fileName();
}

void MdiChild::closeEvent(QCloseEvent *event)
{
    // 如果maybeSave放回true，则关闭窗口
    if (maybeSave())
        event->accept();
    else
        event->ignore();
}

void MdiChild::contextMenuEvent(QContextMenuEvent *e)
{
    // 创建菜单
    QMenu *menu = new QMenu;

    QAction *undo = menu->addAction("撤销(&U)", this, SLOT(undo()), QKeySequence::Undo);
    undo->setEnabled(document()->isUndoAvailable());

    QAction *redo = menu->addAction("恢复(&R)", this, SLOT(redo()), QKeySequence::Redo);
    redo->setEnabled(document()->isRedoAvailable());

    menu->addSeparator();

    QAction *cut = menu->addAction("剪切(&T)", this, SLOT(cut()), QKeySequence::Cut);
    cut->setEnabled(textCursor().hasSelection());

    QAction *copy = menu->addAction("复制(&C)", this, SLOT(copy()), QKeySequence::Copy);
    copy->setEnabled(textCursor().hasSelection());

    menu->addAction("粘贴(&P)", this, SLOT(paste()), QKeySequence::Paste);

    QAction *clear = menu->addAction("清空", this, SLOT(clear()));
    clear->setEnabled(!document()->isEmpty());

    menu->addSeparator();

    QAction *select = menu->addAction("全选", this, SLOT(selectAll()), QKeySequence::SelectAll);
    select->setEnabled(!document()->isEmpty());

    // 获取鼠标位置，然后在这个位置显示菜单
    menu->exec(e->globalPos());

    // 销毁菜单
    delete menu;
}

void MdiChild::documentWasModified()
{
    // 根据文档的isModified返回值判断文档是否被更改了
    setWindowModified(document()->isModified());
}

bool MdiChild::maybeSave()
{
    // 如果文档被修改过
    if (document()->isModified()) {
        QMessageBox box;
        box.setWindowTitle("多文本编辑器");
        box.setText(tr("是否保存对“%1”的更改").arg(userFriendlyCurrentFile()));
        box.setIcon(QMessageBox::Warning);

        QPushButton *yesBtn = box.addButton("是(&Y)", QMessageBox::YesRole);
        box.addButton("否(&N)", QMessageBox::NoRole);
        QPushButton *cancelBtn = box.addButton("取消", QMessageBox::RejectRole);

        box.exec();

        if (box.clickedButton() == yesBtn)
            return save();
        else if (box.clickedButton() == cancelBtn)
            return false;
    }

    return true;
}



void MdiChild::setCurrentFile(const QString &filename)
{
    // 去除路径中的符号链接，“.”和“..”等符号
    curFile = QFileInfo(filename).canonicalFilePath();
    isUntitled = false;
    document()->setModified(false);
    setWindowModified(false);
    setWindowTitle(userFriendlyCurrentFile() + "[*]");
}
